package com.ruoyi.system.utils;

/**
 * @Description: TODO
 * @author: wangp
 * @date: 2025年03月25日 10:59
 */
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ListToZipExporter {
    /**
     * 将多个列表直接打包到ZIP文件（内存高效版）
     * @param contentMap 键值对：文件名 -> 对应的内容列表
     * @param zipFileName 输出的ZIP文件名
     */
    public static void exportToZip(Map<String, List<String>> contentMap,
                                   String zipFileName) throws IOException {
        try (ZipOutputStream zos = new ZipOutputStream(
                new FileOutputStream(zipFileName), StandardCharsets.UTF_8)) {

            for (Map.Entry<String, List<String>> entry : contentMap.entrySet()) {
                // 创建防关闭包装流
                OutputStream noCloseStream = new FilterOutputStream(zos) {
                    @Override
                    public void close() {
                        // 重写close方法，仅flush不关闭底层流
                        try {
                            this.flush();
                        } catch (IOException ignored) {}
                    }
                };

                String txtFileName = ensureTxtExtension(entry.getKey());
                zos.putNextEntry(new ZipEntry(txtFileName));

                // 使用包装流写入内容
                try (BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(noCloseStream, StandardCharsets.UTF_8))) {
                    for (String line : entry.getValue()) {
                        writer.write(line);
                        writer.newLine();
                    }
                } // 此处关闭writer只会flush而不会关闭zos

                zos.closeEntry();
            }
            zos.finish(); // 显式完成压缩
        } // 自动关闭zos
    }


    // 确保文件名以.txt结尾
    private static String ensureTxtExtension(String fileName) {
        return fileName.endsWith(".txt") ? fileName : fileName + ".txt";
    }

    // 将列表内容写入ZIP条目
    private static void writeListToZipEntry(List<String> content,
                                            ZipOutputStream zos) throws IOException {
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(zos, StandardCharsets.UTF_8))) {
            for (String line : content) {
                writer.write(line);
                writer.newLine();
            }
            writer.flush(); // 确保缓冲区内容写入ZIP流
        }
    }

    // 使用示例
    public static void main(String[] args) {
//        Map<String, List<String>> data = Map.of(
//                "file1", List.of("文件1-第一行", "文件1-第二行"),
//                "file2", List.of("文件2-内容A", "文件2-内容B", "文件2-内容C"),
//                "notes", List.of("这是备注文件", "生成时间：2023-10-10")
//        );
//
//        try {
//            exportToZip(data, "output.zip");
//            System.out.println("ZIP文件生成成功！");
//        } catch (IOException e) {
//            System.err.println("生成ZIP文件时出错：" + e.getMessage());
//        }
    }
}